#include <iostream>
#include <cassert>
#include <cstring>
#include <cerrno>
#include <unistd.h>
#include <vector>
#include <pthread.h>

using namespace std;

void *start_routine(void *args)
{
    string threadname = static_cast<char *>(args);
    pthread_detach(pthread_self()); // 设置为分离状态
    int cnt = 5;
    while (cnt--)
    {
        cout << threadname << " running " << endl;
        sleep(1);
    }

    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, start_routine, (void *)"thread one");

    cout << "main thread running..." << endl;

    //一个线程默认是joinable,如果设置的分离状态，就不能够进行等待了
    int n = pthread_join(tid, nullptr);
    cout << "result: " << n << " : " << strerror(n) << endl;
    return 0;
}

// #define NUM 10
// class ThreadData
// {
// public:
//     int number;
//     pthread_t tid;
//     char namebuffer[64];
// };

// class returnCode
// {
// public:
//     int exit_code;
//     int exit_result;
// };

// void *start_routine(void *args)
// {
//     ThreadData *td = static_cast<ThreadData *>(args);
// string name = static_cast<char*>(args);
//     int cnt = 10;
//     while (cnt)
//     {
// cout << "new thread create success, name: " << td->namebuffer << endl;
//         cout << "new thread create success, name: " << td->namebuffer << " cnt: " << cnt-- << endl;
// cout << "thread name: " << name << " cnt: " << cnt-- << endl;
// if(cnt<5)
// {
//     pthread_exit(nullptr);
// }
//         sleep(1);
//     }

//     return (void *)td->number;
// }

// int main()
// {
// pthread_t tid;
// pthread_create(&tid,nullptr,start_routine,(void*)"thread one");
//     vector<ThreadData *> threads;
//     for (int i = 0; i < NUM; i++)
//     {
//         ThreadData *td = new ThreadData();
//         td->number = i + 1;
//         snprintf(td->namebuffer, sizeof(td->namebuffer), "thread:%d", i + 1);
//         pthread_create(&td->tid, nullptr, start_routine, td);
//         threads.push_back(td);

//         sleep(1);
//     }

//     for (auto &iter : threads)
//     {
//         void *ret = nullptr;
//         int n = pthread_join(iter->tid, (void **)&ret);
//         assert(n == 0);
//         cout << "join : " << iter->namebuffer << " sucess,exit_code: " << (long long)ret << endl;
//         delete iter;
//     }

// for (int i = 0; i < threads.size() / 2; i++)
// {
//     pthread_cancel(threads[i]->tid);
//     cout << "pthread_cancel " << threads[i]->namebuffer << "sucess" << endl;
// }

// for (auto &iter : threads)
// {
//     cout << "create thread: " << iter->namebuffer << " : " << iter->tid << " suceesss" << endl;
// }
// while (true)
// {
//     cout << "new thread create success, name: main thread" << endl;
//     sleep(1);
// }
// pthread_join(tid,nullptr);
//     return 0;
// }
// void *start_routine(void *args)
// {
//     while (true)
//     {
//         cout << "我是新线程, 我正在运行! " << endl;
//         sleep(1);
//         int *p = nullptr;
//         *p = 0;
//     }
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, start_routine, (void *)"thread one");
//     assert(0 == n);
//     (void)n;

//     while (true)
//     {
//         cout << "我是主线程, 我正在运行!" << endl;
//         sleep(1);
//     }
//     return 0;
// }
